﻿namespace che14
{
    internal class Text11
    {
        static void Main(string[] args)
        {
            Console.WriteLine("位运算符");
            //位运算符  主要用数值类型进行计算 
            //将数值转换为二进制  再进行位运算

//位与&
            // 规则 连接两个数值进行位计算 将数值转为2进制 
            // 对位运算 有0则0
            int a = 1;//001
            int b = 5;//101
            int c = a & b;
            //    001
            //  &101
            //    001
            Console.WriteLine(c);//结果是1
            a = 3;//011
            b = 19;//10011
            c = a & b;
            //   00011（在前面加0）
            // &10011
            //00011
            Console.WriteLine(c);//结果是3
            //多个数值进行位运算 没有括号时 从左到右 依次计算（有括号就按括号算）
            c = a & b & 4;
            //   00011
            // &10011
            //   00011
            // &00100
            //   00000
            Console.WriteLine(c);//结果是0

  //2.位或|
            // 规则 连接两个数值进行位计算 将数值转为2进制 
            // 对位运算 有1则1

            c = a | b;
            //   00011
            //  |10011
            //   10011
            Console.WriteLine(c);//结果19

            a = 3;//011
            b = 5;//101
            c = a | b | 6;//6→110
            //   011  |  101→111|110→111
            Console.WriteLine(c);//7

  //3.异或^
            // 规则 连接两个数值进行位计算 将数值转为2进制 
            // 对位运算 相同为0 不同为1
            c = a ^ b;
            //011^101→110
            Console.WriteLine(c);//6

            c = 3 ^ 1 ^ 5;
            //011^001→010^101→111
            Console.WriteLine(c);//7

            //4.位取反~
            // 规则 写在数值前面 将数值转为2进制 
            // 对位运算 0变1 1变0
            int i = 4;//因为int有32位 ，所以要补0
            c = ~i;
            //0000 0000 0000 0000 0000 0000 0000 0100
            //1111 1111 1111 1111 1111 1111 1111 1011
            Console.WriteLine(c);//-5
                                 //反码补码知识

            //5.左移<<or右移>>
            // 规则 让一个数的2进制数进行左移和右移
            // 左移几位 右侧加几个0
            a = 1;
            c = a <<2;//a→001<<2→00100
            Console.WriteLine(c);//4
            c = a >> 1;//0
            Console.WriteLine(c);//0

            //作业
            //1.35<<4和66>>1的结果为？
            //10011<<4→100110000→560（原数*2的移几位就是几次方）
            Console.WriteLine(35<<4);
            //100010>>1→10001→33（原数/2的移几位就是几次方）
            Console.WriteLine(66>>1);
            //2.99^33和76|85的结果为？
            //^相同为0不同为1
            //1100011^100001→1000010→66
            Console.WriteLine(99^33);
            //|有1则1
            //1001100|1010101→1011101→93
            Console.WriteLine(76|85);
        }
    }
}

